Transfer Learning
import matplotlib.image as img
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.applications.resnet50 import decode_predictions, preprocess_input
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.callbacks import EarlyStopping, TensorBoard
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing import image
from tensorflow.keras.preprocessing import image_dataset_from_directory
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer
from tqdm import tqdm
- Was ist Transfer Learning:
- Es geht um die Nutzung von Merkmalsrepräsentationen eines bereits trainierten Modells
- man muss ein neues Modell nicht von Grund auf trainieren
- vortrainierte Modelle werden in der Regel anhand umfangreicher Datensätze trainiert, die einen Standard-Benchmark in der Computer-Vision-Branche darstellen.
- daraus können die Gewichte in anderen Bildverarbeitungsaufgaben wiederverwendet werden.
- Modelle können direkt für Vorhersagen bei neuen Aufgaben verwendet
- oder in den Prozess der Ausbildung eines neuen Modells integriert werden
- führt zu einer geringeren Trainingszeit und einem geringeren Generalisierungsfehler.
- besonders nützlich, wenn nur ein kleiner Trainingsdatensatz vorhanden.
- kann auch auf Probleme der natürlichen Sprachverarbeitung angewendet werden
Intuition¶
im = img.imread('13_Transfer_Learning_01-Überblick.png')
plt.figure(dpi=600)
plt.axis("off")
plt.imshow(im)
plt.show()
Vorteil von Pretained Models: Sind allgemein genug,dass sie dann auf andere real-world Probleme angewandt werden können, z.B. Modelle, die auf ImageNet trainert wurden (1000 Kategorien), können z.B. auf Insekten spezialisiert werden.¶
Text Klassifizierung erfordert die Kenntnis von Wortdarstellungen -> viele Trainingsdaten notwendig und langwierig¶
Unterschied zwischen transfer learning und fine-tuning¶
Fine-Tuning¶
- ist ein optionaler Prozess bei dem die Performance verbessert werden soll
- ganzes Model muss immer neu trainiert werden
- Gefahr des Overfitting
- Overfitting kann vermieden werden durch
- das Netz oder nur einen Teil mit niedrigerer Lernrate trainieren (verhindert bedeutsame Updates, die eine schlechte Performance hervorrufen können) oder einen early_stopping einbauen
Transfer Learning¶
- Annahme: Man hat 100 Katzen- und 100 Hundebilder und man möchte diese klassifizieren
- wenige Daten -> starkes Overfitting
- Training auf hohe Genauigkeit benötigt viele Trainingsdaten!
- ImageNet über 1 Million -> Dauert auch sehr lange! Hardware!
Wann funktioniert Transfer Learning nicht?¶
- Wenn high-level Features, die die unteren Schichten gelernt haben, nicht ausreichen, z.B. hat das Netz gelernt, Türen zu erkennen, aber nicht, obdiese offen oder geschlossen sind.
- in einem solchen Fall nimmt man die low-level Features des vortrainiertenNetzwerks und trainiert dann die spezielleren nach, oder nimmt nur die Gewichte der ersten paar Layer
- Wenn Datensätze nicht ähnlich sind, aber auch dann wird ein vortrainiertes Netz besser performen als ein zufällig initialisiertes
- Wenn man die Struktur des Netzes im Verhältnis zum antrainierten ändert,indem man z.B. Schichten entfernt
- kann dann sehr aufwändig werden!
Implementation¶
- Das vortrainierte Model holen, z.B. hier:
im = img.imread('13_Transfer_Learning_02-Base.png')
plt.figure(figsize=(8,5))
plt.axis("off")
plt.imshow(im)
plt.show()
- Basis Model erstellen
- Man erstellt eine Basismodel nach einer bestimmten Architektur, z.B. ResNet oder Xception und kann auch die Gewichte herunterladen.
- Die Output Layer wird wahrscheinlich nicht passen, also wird man diese erst mal entfernen müssen. Später wird dann eine passende eingesetzt.
- Layers einfrieren ("freeze"), damit sie sich während des Trainings nicht ändern
- Wichtiger Schritt, weil man die Gewichte nicht verlieren will!
- base_model.trainable = False
- Neue trainierbare Schichten am Ende einbauen
- Diese neuen Schichten machen aus den alten Features die Vorhersagen für das neue Data Set (wichtig, da ja die Outputlayer gelöscht wurde!).
- Neue Schichten trainieren
- Fine-Tuning
- Optional
- Alle Schichten werden "aufgetaut" ("unfreeze") und trainiert
- LR muss klein sein, da das Modell groß ist und der Datensatz klein
- Dann rekompilieren, weil dann der Zustand wieder eingefroren wird
- Immer wenn man das Verhalten ändern will, muss man neu kompilieren.
Quellen für vortrainierte Modelle¶
- keras.applications
https://keras.io/api/applications/ Wenn man ein Model herunterlädt, sind die Gewichte automatisch mit dabei. Gespeichert in "~/.keras/models/." Alle keras.applications werden für Bilder genutzt.
Beispiel: model = tf.keras.applications.MobileNet( input_shape=None, alpha=1.0, depth_multiplier=1, dropout=0.001, include_top=True, weights="imagenet", input_tensor=None, pooling=None, classes=1000, classifier_activation="softmax", )
- Tensorflow
https://www.tensorflow.org/hub
Beispiel: model = tf.keras.Sequential([ hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4", trainable=False), tf.keras.layers.Dense(num_classes, activation='softmax') ])
- Word Embedding
Für Text Klassizierung:
- https://nlp.stanford.edu/projects/glove/
- https://code.google.com/archive/p/word2vec/ trainiert an 1 Billion Wörtern von Google News
- https://fasttext.cc/docs/en/english-vectors.html für englische Wörter
weiterführende Infos:
https://neptune.ai/blog/word-embeddings-deep-dive-into-custom-datasets
- Hugging Face
- ebenfalls für Aufgaben mit Texten wie
- Fragen beantworten
- Zusammenfassen
- Übersetzung
- Text Generierung
- ...
- über 100 Sprachen werden unterstützt
- ebenfalls für Aufgaben mit Texten wie
Beispiel: from transformers import pipeline classifier = pipeline('sentiment-analysis') classifier('We are very happy to include pipeline into the transformers repository.')
Ausgabe: [{'label': 'POSITIVE', 'score': 0.9978193640708923}]
Implementierung von vortrainierten Modellen¶
1. Vorhersage¶
- Model herunterladen und sofort Vorhersagen machen, z.B. mit
- https://keras.io/api/applications/resnet/#resnet50-function (ist auf ImageNet trainiert)
model = ResNet50(weights='imagenet')
img_path = '13_Transfer_Learning_03-elephant2.jpg'
imag = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(imag)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
im = img.imread('13_Transfer_Learning_03-elephant.jpg')
plt.figure(dpi=600)
plt.axis("off")
plt.imshow(im)
plt.show()